iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

從電子元件到傅立葉轉換 - 那些我有興趣的主題系列 第 14

[Day14] 硬體的世界大不同 – I2C

  • 分享至 

  • xImage
  •  

I2C(唸作 i squared c),全名是 Inter-Integrated Circuit。是一種序列通訊協定,在低速周邊當中常常使用。

上一篇我們提到了 UART,然而 UART 因為沒有 clock 信號的關係,需要雙方事先決定好 Baud rate,否則沒辦法正確解析資料,而且 UART 一次用在一組裝置(一對一)。

I2C 是一種多主從架構,使用兩條線來傳輸,一條為傳輸資料的線(通常稱作 SDA),另外一條則是傳送停止與開始信號以及時脈的線(SCL)。

在實際應用當中,有些感測器的組成比較複雜,直接讀取數據可能對 MCU 來說不容易,因此這類型的感測器會另外集成一個 I2C 的電路,對 MCU 來說,只要發送對應的指令碼,感測器就會回傳對應的資料,省下 MCU 自己測量感測器的步驟。

I2C 介紹

接下來介紹一下 I2C 的實際運作:

  • SCL 為高電位:
    • SDA 從 HIGH 變成 LOW,代表開始信號
    • SDA 從 LOW 變成 HIGH,代表停止信號
  • 在 IDLE 狀態時,SCL 和 SDA 都為高電位
  • 當 SCL 為高電位時,可以讀取 SDA 的資料
  • SCL 為低電位時,可以改變 SDA 的資料

每次傳完 8bit 的資料時,會發送一個 1bit 的 ACK 信號。

  1. 送出 START 信號
  2. 送出 7bit 想要通訊的裝置位址,這個位址通常寫在資料表上
  3. 送出 1bit 讀寫位元,表示是否要讀(1)還是要寫(0)
  4. 如果對應的裝置有收到信號,會回傳一個 ACK 信號
  5. 開始傳送 1byte 資料
  6. 每送完一次就會 ACK 一次
  7. 持續此過程直到收到 STOP 信號

(圖片取自維基百科)

像是溫度感測器、LCD 螢幕這類型的周邊設備,如果要求的頻率不高時,透過 I2C 來收發資料很方便。

AVR 當中的 I2C

Arduino 的 I2C

在 Arduino 當中,I2C 被包裝成 Wire.h,只要引入這個函式庫即可使用。

#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 0;

void loop()
{
  Wire.beginTransmission(4); // transmit to device #4
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte  
  Wire.endTransmission();    // stop transmitting

  x++;
  delay(500);
}

比較常見的 API 有:

  • beginTransmission:開始傳送
  • write:傳送資料。這邊 Arduino 會幫你處理 8bit 送 ACK 的邏輯
  • endTransmisstion:結束傳送

跟 UART 不一樣的地方是,I2C 可以任意選擇兩個 GPIO 接腳當作 SDA 與 SCL,使用上比較有彈性一些。

背後的運作與上篇 UART 提到的有點類似,以 AVR 來說,背後都是由數個暫存器來保存狀態,發送與接收的 buffer 等等,這邊就不另外解說。


上一篇
[Day13] 硬體的世界大不同 – UART
下一篇
[Day15] 驅動現代社會的半導體 (1) - 半導體是什麼
系列文
從電子元件到傅立葉轉換 - 那些我有興趣的主題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言